package com.foftact.etfweekly.mapper;

import com.foftact.etfweekly.ETFWeekly;
import org.apache.ibatis.annotations.Param;
import java.util.List;
import java.util.Date;

/**
 * ETF周线数据访问接口
 * 定义ETF周线数据的数据库操作方法
 */
public interface ETFWeeklyMapper {
    /**
     * 插入单个ETF历史净值数据
     * @param etfWeekly ETF历史净值数据
     * @return 插入影响的行数
     */
    int insert(ETFWeekly etfWeekly);

    /**
     * 批量插入ETF历史净值数据
     * @param etfWeeklyList ETF历史净值数据列表
     * @return 插入影响的行数
     */
    int batchInsert(@Param("etfWeeklyList") List<ETFWeekly> etfWeeklyList);

    /**
     * 根据板块/ETF代码和日期范围查询ETF周线数据
     * @param code 板块/ETF代码
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return ETF周线数据列表
     */
    List<ETFWeekly> selectByCodeAndDateRange(@Param("code") String code, 
                                          @Param("startDate") Date startDate, 
                                          @Param("endDate") Date endDate);

    /**
     * 查询所有ETF历史净值数据
     * @return ETF历史净值数据列表
     */
    List<ETFWeekly> selectAll();

    /**
     * 根据ID查询ETF历史净值数据
     * @param id 主键ID
     * @return ETF历史净值数据
     */
    ETFWeekly selectById(Long id);

    /**
     * 根据板块/ETF代码和周线日期查询ETF周线数据
     * @param code 板块/ETF代码
     * @param weekDate 周线日期
     * @return ETF周线数据
     */
    ETFWeekly selectByCodeAndWeekDate(@Param("code") String code, @Param("weekDate") Date weekDate);

    List<ETFWeekly> selectByCodeAndWeekDates(@Param("code") String code, @Param("weekDates") List<String> weekDates);

    /**
     * 更新ETF历史净值数据
     * @param etfWeekly ETF历史净值数据
     * @return 更新影响的行数
     */
    int update(ETFWeekly etfWeekly);

    /**
     * 根据ID删除ETF历史净值数据
     * @param id 主键ID
     * @return 删除影响的行数
     */
    int deleteById(Long id);

    /**
     * 根据板块/ETF代码和周线日期删除ETF周线数据
     * @param code 板块/ETF代码
     * @param weekDate 周线日期
     * @return 删除影响的行数
     */
    int deleteByCodeAndWeekDate(@Param("code") String code, @Param("weekDate") Date weekDate);

    /**
     * 获取指定板块/ETF的最近N条周线数据
     * @param code 板块/ETF代码
     * @param limit 记录条数
     * @return ETF周线数据列表
     */
    List<ETFWeekly> selectRecentByCode(@Param("code") String fundCode, @Param("limit") Integer limit);

    /**
     * 清空ETF周线表
     * @return 清空影响的行数
     */
    int truncateTable();
    
    // update方法已在前面定义
    
    /**
     * 插入或更新ETF周线数据（如果存在则更新，不存在则插入）
     * @param etfWeekly ETF周线数据
     * @return 操作影响的行数
     */
    int insertOrUpdate(ETFWeekly etfWeekly);

    int batchInsertOrUpdate(List<ETFWeekly> dataToSave);
}